# !/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2022/1/7 11:21 下午
# @Author : 曹庭
# @File : models.py
# @Software: PyCharm
#
# """
#     类型	            对应python	          说明
#     ----------------------------------------------------------
#     Integer	        int	                  普通整数，一般是三十二位
#     SmallInteger	int	                  取值范围小的整数,一般是十六位
#     BigInteger	    int或long	          不限制精度整数
#     Float	        Float	              浮点数
#     Numeric	        decimal,Decimal	      普通浮点数，一般是三十二位
#     String	        str	                  变长字符串
#     Text	        str	                  变长字符串，对较长或不限长度的字符串做了优化
#     Unicode	        unicode	              变长unicode字符串
#     UnicodeText	    unicode	              变长Unicode字符串，对较长或不限长度的字符串做了优化
#     Boolean	        bool	              布尔值
#     Date	        datetime.date	      时间
#     time	        datetime.datetime	  日期和时间
#     LargeBinary	    str	                  二进制文件
# """
#
# """
#     选项	            说明
#     primary_key	    主键
#     uunique	        唯一值
#     index	        建立索引
#     nulltable	    True允许有空值
#     default	        默认值
# """

from datetime import datetime
from . import db
from werkzeug.security import generate_password_hash, check_password_hash
from course import constants


class BaseModel(object):
    """模型基类，为每个模型补充创建时间与更新时间"""

    create_time = db.Column(db.DateTime, default=datetime.now)  # 记录的创建时间
    update_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)  # 记录的更新时间


class User(BaseModel, db.Model):
    """用户表"""

    __tablename__ = "cs_user"

    id = db.Column(db.Integer, primary_key=True)  # 用户编号
    user_name = db.Column(db.String(32), unique=True, nullable=False)  # 用户名
    password_hash = db.Column(db.String(128), nullable=False)  # 加密的密码
    mail = db.Column(db.String(32), unique=True, nullable=False)  # 邮箱
    avatar_url = db.Column(db.String(128))  # 用户头像路径
    is_vip = db.Column(db.Integer, default=2)  # vip 是-1 否-2
    vip_start_time = db.Column(db.DateTime, nullable=True)  # 会员开始时间
    vip_end_time = db.Column(db.DateTime, nullable=True)  # 会员结束时间

    # 加上property装饰器后，会把函数变为属性，属性名即为函数名
    @property
    def password(self):
        """读取属性的函数行为"""
        # print(user.password)  # 读取属性时被调用
        # 函数的返回值会作为属性值
        # return "xxxx"
        raise AttributeError("这个属性只能设置，不能读取")

    # 使用这个装饰器, 对应设置属性操作
    @password.setter
    def password(self, value):
        """
        设置属性  user.passord = "xxxxx"
        :param value: 设置属性时的数据 value就是"xxxxx", 原始的明文密码
        :return:
        """
        self.password_hash = generate_password_hash(value)

    def check_password(self, passwd):
        """
        检验密码的正确性
        :param passwd:  用户登录时填写的原始密码
        :return: 如果正确，返回True， 否则返回False
        """
        return check_password_hash(self.password_hash, passwd)

    def to_dict(self):
        """将对象转换为字典数据"""
        user_dict = {
            "user_id": self.id,
            "user_name": self.user_name,
            "mail": self.mail,
            "is_vip": self.is_vip,
            "avatar": constants.QINIU_URL_DOMAIN + self.avatar_url if self.avatar_url else "",
            "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S")
        }
        return user_dict


class Contents(BaseModel, db.Model):
    """类目表"""

    __tablename__ = "cs_contents"

    id = db.Column(db.Integer, primary_key=True)  # 类目编号
    contents_name = db.Column(db.String(32), nullable=False)  # 类目名称
    contents_level = db.Column(db.Integer, nullable=True)  # 类目级别

    def to_dict(self):
        """将对象转换为字典"""
        d = {
            "contents_id": self.id,
            "contents_name": self.contents_name,
            "contents_level": self.contents_level
        }
        return d


class Label(BaseModel, db.Model):
    """标签表"""

    __tablename__ = "cs_label"

    id = db.Column(db.Integer, primary_key=True)  # 标签编号
    label_name = db.Column(db.String(32), nullable=False)  # 标签名称

    def to_dict(self):
        """将对象转换为字典"""
        d = {
            "label_id": self.id,
            "label_name": self.label_name
        }
        return d


class Course(BaseModel, db.Model):
    """课程表"""

    __tablename__ = "cs_course"

    id = db.Column(db.Integer, primary_key=True)  # 课程编号
    contents_id = db.Column(db.Integer, nullable=False)  # 类目编号
    label_id = db.Column(db.Integer, nullable=False)  # 标签编号
    title = db.Column(db.String(64), nullable=False)  # 标题
    normal_price = db.Column(db.Integer, default=0)  # 正常价格，单位：分
    vip_price = db.Column(db.Integer, default=0)  # vip价格，单位：分
    introduce = db.Column(db.Text, nullable=False)  # 课程介绍
    contents = db.Column(db.Text, nullable=False)  # 课程目录
    index_image_url = db.Column(db.String(256), default="")  # 课程主图片的路径

    def to_basic_dict(self):
        """将基本信息转换为字典数据"""
        course_dict = {
            "course_id": self.id,
            "contents_id": self.contents_id,
            "label_id": self.label_id,
            "title": self.title,
            "normal_price": self.normal_price,
            "vip_price": self.vip_price,
            "introduce": self.introduce,
            "contents": self.contents,
            "index_image_url": constants.QINIU_URL_DOMAIN + self.index_image_url if self.index_image_url else "",
            "create_time": self.create_time.strftime("%Y-%m-%d")
        }
        return course_dict


class Image(BaseModel, db.Model):
    """图片表"""

    __tablename__ = "cs_image"

    id = db.Column(db.Integer, primary_key=True)  # 图片编号
    course_id = db.Column(db.Integer, nullable=False)  # 课程编号
    screenshot_url = db.Column(db.String(256), nullable=False)  # 图片的路径
    is_index_img = db.Column(db.Integer, default=2)  # 是-1 否-2

    def to_dict(self):
        """将基本信息转换为字典数据"""
        image_dict = {
            "image_id": self.id,
            "course_id": self.course_id,
            "screenshot_url": constants.QINIU_URL_DOMAIN + self.screenshot_url,
            "is_index_img": self.is_index_img,
            "image_name": self.screenshot_url
        }
        return image_dict


class PanShare(BaseModel, db.Model):
    """网盘分享链接表"""

    __tablename__ = "cs_panshare"

    id = db.Column(db.Integer, primary_key=True)  # 链接编号
    course_id = db.Column(db.Integer, nullable=False)  # 课程编号
    share_url = db.Column(db.String(256), nullable=False)  # 分享链接
    share_code = db.Column(db.String(10), nullable=False)  # 分享码

    def to_share(self):
        sharetext = "网盘链接：" + self.share_url + "\n提取码：" + self.share_code
        return sharetext

    def to_dict(self):
        """将基本信息转换为字典数据"""
        panshare_dict = {
            "share_url": self.share_url,
            "share_code": self.share_code
        }
        return panshare_dict


class Order(BaseModel, db.Model):
    """订单"""

    __tablename__ = "cs_order"

    id = db.Column(db.Integer, primary_key=True)  # 订单编号
    user_id = db.Column(db.Integer, nullable=False)  # 下订单的用户编号
    course_id = db.Column(db.Integer, nullable=False)  # 课程编号
    order_price = db.Column(db.Integer, nullable=False)  # 订单价格
    order_status = db.Column(db.Integer, nullable=False)  # 订单的状态 1-待支付  2-已支付  3-已完成   4-已取消
    trade_no = db.Column(db.String(80))  # 交易的流水号 支付宝的

    def to_dict(self):
        """将订单信息转换为字典数据"""
        order_dict = {
            "order_id": self.id,
            "user_id": self.user_id,
            "course_id": self.course_id,
            "order_price": self.order_price,
            "order_status": self.order_status,
            "trade_no": self.trade_no,
            "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S")
        }
        return order_dict
